package com.wpp.concurrent.demo4_wait_notify;

/**
 * @author wpp25
 * @date 2021/6/23 21:33
 * @description：
 * 生产者在通知消费者的同时，也通知了其他的生产者；
 * 消费者在通知生产者的同时，也通知了其他消费者。
 * 原因在于wait()和notify()所作用的对象和synchronized所作用的对象是同一个，只能有一个对象，无法区分队列空和列队满两个条件。这正是Condition要解决的问题。
 */
public class Demo4Queue {

    // 模拟 循环队列
    private final String[] arr = new String[10];

    private int putIndex = 0;
    private int getIndex = 0;

    private int size = 0;


    public synchronized void put(String element) {
        while (arr.length == size) {
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        arr[putIndex++] = element;
        size++;
        notify();
        if (arr.length == putIndex) {

            putIndex = 0;
        }

    }

    public synchronized String get() {
        while (size == 0) {
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        String get = arr[getIndex++];
        size--;
        notify();
        if (arr.length == getIndex) {
            getIndex = 0;
        }

        return get;
    }
}
